/*
* Copyright (C) 2010-2012 Magnus Skjegstad
* 
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
* 
* The latest version of this library can be downloaded from http://mist-pubsub.googlecode.com
* 
*/

package com.skjegstad.simpleevents;

import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 *
 * @author Magnus Skjegstad
 */
public class SimpleEventManager {
    
    private ConcurrentHashMap<String,SimpleEventPipe> eventPipes = new ConcurrentHashMap();
    private ExecutorService executorService = Executors.newCachedThreadPool();
    
    protected String defaultContext = "DEFAULT_CONTEXT";  
    protected String instanceName = "EVENTMGR-" + Thread.currentThread().getId();

    public SimpleEventManager() {
    }

    public SimpleEventManager(String name) {
        instanceName = name;
    }

    public String getInstanceName() {
        return instanceName;
    }
        
            
    public SimpleEventPipe getPipe(String context) {
        SimpleEventPipe pipe = eventPipes.get(context);
        if (pipe == null) {
            eventPipes.putIfAbsent(context, new SimpleEventPipe(executorService));
            pipe = eventPipes.get(context);
        }
        
        return pipe;
    }
    
    public SimpleEventPipe getDefaultPipe() {
        return getPipe(defaultContext);
    }
    
    public SimpleEventPipe getUniquePipe(String owner) {
        return getPipe(owner + "-" + UUID.randomUUID().toString());
    }
    
    public void shutdown() {
        executorService.shutdownNow();
        eventPipes = new ConcurrentHashMap();
    }
    
}
